package pe.com.bbva.ge.vista.vaadin.ui.solicitud;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.ge.domain.configuracion.Denominacion;
import pe.com.bbva.ge.domain.configuracion.Valor;
import pe.com.bbva.ge.domain.solicitud.DetalleDenominacion;
import pe.com.bbva.ge.domain.solicitud.DetalleMoneda;
import pe.com.bbva.ge.negocio.ConfiguracionNegocio;
import pe.com.bbva.ge.negocio.SolicitudNegocio;
import pe.com.bbva.ge.vista.vaadin.ui.BaseUI;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.ManejadorDenominacion;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.ManejadorDenominacion2;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.ManejadorDivisa;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.UtileriaVista;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.event.FieldEvents.BlurEvent;
import com.vaadin.event.FieldEvents.BlurListener;
import com.vaadin.event.FieldEvents.FocusEvent;
import com.vaadin.event.FieldEvents.FocusListener;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

public class SolicitudModificarUI extends BaseUI implements BlurListener, FocusListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private GridLayout lytDetalleDivisa;
	@AutoGenerated
	private HorizontalLayout lytTotaldivisa;
	@AutoGenerated
	private TextField txtFaltante;
	@AutoGenerated
	private Label lblFaltante;
	@AutoGenerated
	private TextField txtTotalSolicitado;
	@AutoGenerated
	private Label lblTotalSolicitado;
	@AutoGenerated
	private Label lblDivisa;
	
	@Autowired
	private ConfiguracionNegocio genericoNegocio;	
	@Autowired
	private SolicitudNegocio solicitudNegocio;
	private Valor divisa;
	private static final String tamanho = "55px"; 
	private DetalleMoneda detalleMoneda;
	private ManejadorDivisa manejadorDivisa;
	
	public SolicitudModificarUI(DetalleMoneda detalleMoneda) {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		this.detalleMoneda=detalleMoneda;
		this.manejadorDivisa = new ManejadorDivisa(txtTotalSolicitado, txtFaltante);
		
	}

	
	@Override
	public void postConstruccion() {
		lblDivisa.setValue(divisa.getNombre());
		txtFaltante.setEnabled(false);		
		List<Denominacion> denominaciones = genericoNegocio.obtenerDenominaciones(divisa);		
		int filas = 4;		
		lytDetalleDivisa.setColumns(denominaciones.size());
		lytDetalleDivisa.setRows(filas);		
		txtTotalSolicitado.setValue(detalleMoneda.getTotal().toString());		
		DecimalFormat df = new DecimalFormat();
		df.setMaximumFractionDigits(2);
		df.setMinimumFractionDigits(0);
		df.setGroupingUsed(false);	
		for (int i = 0; i < denominaciones.size(); i++) {
			Denominacion denominacion = denominaciones.get(i);
			int j = 0;
			Label titulo = new Label(df.format(denominacion.getValor()));
			titulo.setWidth(tamanho);
			
			lytDetalleDivisa.addComponent(titulo, i, j++);
			
			TextField txtSolicitado = agregarInputText(new BeanText(false, "Solicitado"));
			TextField txtCantidad = agregarInputText(new BeanText(true, "Cantidad"));
			TextField txtImporte = agregarInputText(new BeanText(true, "Importe"));														
			ManejadorDenominacion2 manejadorDenominacion = new ManejadorDenominacion2(denominacion, manejadorDivisa, txtSolicitado, txtCantidad, txtImporte, null);			
			manejadorDivisa.agregarManejadorDenominacion(denominacion, manejadorDenominacion);
			List<DetalleDenominacion> lstDetalleDenominacion=solicitudNegocio.obtenerDetalleDenominaciones(detalleMoneda);
			for(DetalleDenominacion detalleDenominacion:lstDetalleDenominacion){
				if(denominacion.getCodigo().equals(detalleDenominacion.getDenominacion().getCodigo())){
					txtCantidad.setValue(detalleDenominacion.getSolicitado().toString());
					txtSolicitado.setValue(denominacion.getValor().multiply(new BigDecimal(detalleDenominacion.getSolicitado())).toString());
					break;
				}
			}			
			lytDetalleDivisa.addComponent(txtSolicitado, i, j++);
			lytDetalleDivisa.addComponent(txtCantidad, i, j++);
			lytDetalleDivisa.addComponent(txtImporte, i, j++);
			
		}
	}

	public Valor getDivisa() {
		return divisa;
	}

	public void setDivisa(Valor divisa) {
		this.divisa = divisa;
	}
	
	/*public List<DetalleDenominacion> getDenominaciones(){
		List<DetalleDenominacion> denominaciones = new ArrayList<DetalleDenominacion>();
		
		Iterator<Denominacion> iterator = mapDenominacionPorTotales.keySet().iterator();
		DetalleDenominacion detalleDenominacion;
		while(iterator.hasNext()){
			Denominacion denominacion = iterator.next();
			ManejadorDenominacion manejadorDenominacion = mapDenominacionPorTotales.get(denominacion);
			if(manejadorDenominacion.tieneMonto()){
				detalleDenominacion = new DetalleDenominacion();
				detalleDenominacion.setDenominacion(denominacion);
				detalleDenominacion.setSolicitado(manejadorDenominacion.getSolicitado());
				detalleDenominacion.setDeteriorado(manejadorDenominacion.getDeteriorado());
				denominaciones.add(detalleDenominacion);
			}
		}
		
		return denominaciones;
	}*/
	
	public BigDecimal getTotalDivisa(){
		return UtileriaVista.obtenerBigDecimal(txtTotalSolicitado);
	}
	
	@Override
	public void focus(FocusEvent event) {
		
	}

	@Override
	public void blur(BlurEvent event) {
		
	}
	
	private class BeanText
	{
		private boolean habilitado; 
		private String inputPrompt;
		
		private BeanText(boolean habilitado, String inputPrompt) {
			this.habilitado = habilitado;
			this.inputPrompt = inputPrompt;
		}
		
	}
	
	private TextField agregarInputText(BeanText beanText) {
		TextField txt = new TextField();
		txt.setEnabled(beanText.habilitado);
		txt.setInputPrompt(beanText.inputPrompt);
		txt.setWidth(tamanho);
		return txt;
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// lytTotaldivisa
		lytTotaldivisa = buildLytTotaldivisa();
		mainLayout.addComponent(lytTotaldivisa);
		
		// lytDetalleDivisa
		lytDetalleDivisa = new GridLayout();
		lytDetalleDivisa.setImmediate(false);
		lytDetalleDivisa.setWidth("-1px");
		lytDetalleDivisa.setHeight("-1px");
		lytDetalleDivisa.setMargin(false);
		mainLayout.addComponent(lytDetalleDivisa);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildLytTotaldivisa() {
		// common part: create layout
		lytTotaldivisa = new HorizontalLayout();
		lytTotaldivisa.setImmediate(false);
		lytTotaldivisa.setWidth("-1px");
		lytTotaldivisa.setHeight("-1px");
		lytTotaldivisa.setMargin(false);
		lytTotaldivisa.setSpacing(true);
		
		// lblDivisa
		lblDivisa = new Label();
		lblDivisa.setImmediate(false);
		lblDivisa.setWidth("-1px");
		lblDivisa.setHeight("-1px");
		lblDivisa.setValue("Label");
		lytTotaldivisa.addComponent(lblDivisa);
		
		// lblTotalSolicitado
		lblTotalSolicitado = new Label();
		lblTotalSolicitado.setImmediate(false);
		lblTotalSolicitado.setWidth("-1px");
		lblTotalSolicitado.setHeight("-1px");
		lblTotalSolicitado.setValue("Total:");
		lytTotaldivisa.addComponent(lblTotalSolicitado);
		
		// txtTotalSolicitado
		txtTotalSolicitado = new TextField();
		txtTotalSolicitado.setImmediate(false);
		txtTotalSolicitado.setWidth("-1px");
		txtTotalSolicitado.setHeight("-1px");
		txtTotalSolicitado.setInputPrompt("Total Solicitado");
		lytTotaldivisa.addComponent(txtTotalSolicitado);
		
		// lblFaltante
		lblFaltante = new Label();
		lblFaltante.setImmediate(false);
		lblFaltante.setWidth("-1px");
		lblFaltante.setHeight("-1px");
		lblFaltante.setValue("Faltante/Sobrante:");
		lytTotaldivisa.addComponent(lblFaltante);
		
		// txtFaltante
		txtFaltante = new TextField();
		txtFaltante.setImmediate(false);
		txtFaltante.setWidth("-1px");
		txtFaltante.setHeight("-1px");
		txtFaltante.setInputPrompt("Restante");
		lytTotaldivisa.addComponent(txtFaltante);
		
		return lytTotaldivisa;
	}

}
